package com.javaxyq.util; import java.io.File; import java.io.IOException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.FloatControl; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; public class AudioPlayer { /** Plays audio from given file names. */ public static void main(String[] args) { // Check for given sound file names. if (args.length < 1) { System.out.println("Play usage:"); System.out.println("\tjava Play <sound file names>*"); System.exit(0); } // Process arguments. for (int i = 0; i < args.length; i++) playAudioFile(args[i]); // Must exit explicitly since audio creates non-daemon threads. System.exit(0); } // main public static void playAudioFile(String fileName) { File soundFile = new File(fileName); try { // Create a stream from the given file. // Throws IOException or UnsupportedAudioFileException AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile); // AudioSystem.getAudioInputStream( inputStream ); // alternate // audio stream from inputstream playAudioStream(audioInputStream); } catch (Exception e) { System.out.println("Problem with file " + fileName + ":"); e.printStackTrace(); } } // playAudioFile /** Plays audio from the given audio input stream. */ public static void playAudioStream(AudioInputStream audioInputStream) { // Audio format provides information like sample rate, size, channels. AudioFormat audioFormat = audioInputStream.getFormat(); System.out.println("Play input audio format=" + audioFormat); // Open a data line to play our type of sampled audio. // Use SourceDataLine for play and TargetDataLine for record. DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); if (!AudioSystem.isLineSupported(info)) { System.out .println("Play.playAudioStream does not handle this type of audio on this system."); return; } try { // Create a SourceDataLine for play back (throws // LineUnavailableException). SourceDataLine dataLine = (SourceDataLine) AudioSystem.getLine(info); // System.out.println( "SourceDataLine class=" + dataLine.getClass() // ); // The line acquires system resources (throws // LineAvailableException). dataLine.open(audioFormat); // Adjust the volume on the output line. if (dataLine.isControlSupported(FloatControl.Type.MASTER_GAIN)) { FloatControl volume = (FloatControl) dataLine .getControl(FloatControl.Type.MASTER_GAIN); volume.setValue(100.0F); } // Allows the line to move data in and out to a port. dataLine.start(); // Create a buffer for moving data from the audio stream to the // line. int bufferSize = (int) audioFormat.getSampleRate() * audioFormat.getFrameSize(); byte[] buffer = new byte[bufferSize]; // Move the data until done or there is an error. try { int bytesRead = 0; while (bytesRead >= 0) { bytesRead = audioInputStream.read(buffer, 0, buffer.length); if (bytesRead >= 0) { // System.out.println( // "Play.playAudioStream bytes read=" + bytesRead + // ", frame size=" + audioFormat.getFrameSize() + // ", frames read=" + bytesRead / // audioFormat.getFrameSize() ); // Odd sized sounds throw an exception if we don't write // the same amount. int framesWritten = dataLine.write(buffer, 0, bytesRead); } } // while } catch (IOException e) { e.printStackTrace(); } System.out.println("Play.playAudioStream draining line."); // Continues data line I/O until its buffer is drained. dataLine.drain(); System.out.println("Play.playAudioStream closing line."); // Closes the data line, freeing any resources such as the audio // device. dataLine.close(); } catch (LineUnavailableException e) { e.printStackTrace(); } } // playAudioStream } // Play